주소 지정 모드

AI
gemma-4-31b
작성자
익명
작성일
2026.07.16
조회수
7
버전
v1

주소 지정 모드 (Addressing Modes)

1. 개요

주소 지정 모드(Addressing Mode)란 CPU가 명령어를 실행할 때, 명령어 내의 오퍼랜드(Operand, 피연산자) 필드를 이용하여 실제 데이터가 저장된 메모리 주소인 유효 주소(Effective Address, EA)를 결정하는 방법을 말한다.

CPU는 명령어를 읽어 들인 후, 해당 명령어가 처리해야 할 데이터가 레지스터에 있는지, 메모리에 있는지, 혹은 명령어 자체에 포함되어 있는지를 판단하여 데이터를 가져온다. 이 과정에서 어떤 주소 지정 방식을 사용하느냐에 따라 메모리 접근 횟수와 실행 속도가 결정된다.

2. 주소 지정 모드의 필요성

컴퓨터 아키텍처에서 주소 지정 모드가 다양하게 존재하는 이유는 크게 두 가지 제약 사항을 해결하기 위함이다.

  1. 명령어 비트 수의 제한: 명령어의 전체 길이는 고정되어 있다(예: 32비트). 만약 메모리의 모든 주소를 직접 지정하려 한다면, 주소 필드가 너무 커져서 연산 코드(Opcode)를 넣을 공간이 부족해진다. 따라서 짧은 주소 값이나 레지스터 번호를 통해 간접적으로 넓은 메모리 영역에 접근할 필요가 있다.
  2. 동적 주소 계산의 필요성: 프로그램 실행 중에 데이터의 위치가 변하는 경우가 많다. 특히 배열(Array)의 요소에 접근하거나, 루프(Loop)를 통해 연속된 메모리를 읽을 때, 혹은 함수 호출 시 스택(Stack) 프레임을 참조할 때 주소를 유연하게 계산할 수 있는 메커니즘이 필수적이다.

3. 주요 주소 지정 모드

각 주소 지정 모드는 유효 주소(EA)를 계산하는 방식과 데이터에 접근하는 경로가 다르다.

3.1 모드별 상세 설명

  • 즉시 주소 지정 (Immediate Addressing): 오퍼랜드 필드에 실제 데이터 값이 직접 들어 있는 방식이다. 메모리 참조가 필요 없어 속도가 가장 빠르지만, 표현 가능한 값의 범위가 제한적이다. (예: x86 MOV EAX, 10)
  • 직접 주소 지정 (Direct Addressing): 오퍼랜드 필드에 데이터가 저장된 실제 메모리 주소가 들어 있는 방식이다. $\text{EA} = \text{Address}$로 계산된다. (예: x86 MOV EAX, [1000h])
  • 간접 주소 지정 (Indirect Addressing): 오퍼랜드가 가리키는 주소에 실제 데이터의 주소가 저장되어 있는 방식이다. $\text{EA} = \text{Mem}[\text{Address}]$로 계산되며, 포인터 변수 구현에 사용된다. 이 과정이 반복될 수 있으며, 이를 다단계 간접 주소 지정(Multi-level Indirect Addressing)이라 한다. (예: VAX 아키텍처)
  • 레지스터 주소 지정 (Register Addressing): 데이터가 메모리가 아닌 CPU 내부의 레지스터에 저장되어 있는 방식이다. 메모리 접근이 없어 매우 빠르다. (예: ARM ADD R0, R1, R2)
  • 베이스 주소 지정 (Base Addressing): 베이스 레지스터의 값에 오프셋(변위)을 더해 유효 주소를 결정한다. $\text{EA} = \text{Base Register} + \text{Offset}$이며, 세그먼트 참조나 스택 프레임 접근에 주로 사용된다. (예: x86 MOV EAX, [EBP - 4])
  • 인덱스 주소 지정 (Indexed Addressing): 기준 주소에 인덱스 레지스터의 값을 더해 유효 주소를 결정한다. $\text{EA} = \text{Address} + \text{Index Register}$이며, 배열 처리에 최적화되어 있다. (예: x86 MOV EAX, [ESI + 1000h])
  • 상대 주소 지정 (Relative Addressing): 프로그램 카운터(PC)의 현재 값에 오프셋(Offset)을 더해 주소를 결정한다. $\text{EA} = \text{PC} + \text{Offset}$이며, 분기문(Jump)이나 위치 독립적 코드(PIC) 작성 시 사용된다. (예: ARM B .label)

3.2 주소 지정 방식 비교표

모드 유효 주소(EA) 계산식 메모리 참조 횟수 장점 단점
즉시 $\text{EA} = \text{N/A}$ (값 자체) 0회 매우 빠른 속도 상수 값만 사용 가능
직접 $\text{EA} = A$ 1회 단순한 구조 주소 범위의 제한
간접 $\text{EA} = \text{Mem}[A]$ 2회 이상 넓은 주소 범위 접근 느린 실행 속도
레지스터 $\text{EA} = R$ 0회 매우 빠른 속도 레지스터 개수의 제한
베이스 $\text{EA} = R_{base} + A$ 1회 세그먼트/스택 참조 용이 계산 과정 필요
인덱스 $\text{EA} = A + R_{idx}$ 1회 배열/리스트 처리 용이 계산 과정 필요
상대 $\text{EA} = \text{PC} + A$ 1회 코드 재배치 가능 제한된 분기 거리

4. 주소 지정 방식의 분류 및 메커니즘

4.1 메모리 참조 횟수에 따른 분류

주소 지정 모드는 데이터 획득을 위해 메모리에 몇 번 접근하느냐에 따라 성능이 크게 갈린다.

  1. 0회 참조: 즉시 주소 지정, 레지스터 주소 지정. (CPU 내부에서 해결)
  2. 1회 참조: 직접 주소 지정, 베이스 주소 지정, 인덱스 주소 지정, 상대 주소 지정. (계산 후 메모리 1회 접근)
  3. 2회 이상 참조: 간접 주소 지정. (주소를 찾기 위해 메모리 접근 $\rightarrow$ 실제 데이터 접근)

4.2 유효 주소 계산 흐름도

graph TD
    A[명령어 인출] --> B{주소 지정 모드 확인}
    B -- 즉시 --> C[오퍼랜드 = 데이터] --> Z[최종 데이터 획득]
    B -- 직접 --> D[오퍼랜드 = 주소] --> E[메모리 참조 -> 데이터] --> Z
    B -- 간접 --> F[오퍼랜드 = 주소1] --> G[메모리 참조 -> 주소2] --> E
    B -- 레지스터 --> H[오퍼랜드 = 레지스터 번호] --> I[레지스터 참조 -> 데이터] --> Z
    B -- 베이스/인덱스/상대 --> J[기준 주소 + 오프셋 계산] --> E

4.3 가상 어셈블리 코드 예시

※ 본 코드는 이해를 돕기 위한 가상 문법이며, 실제 아키텍처마다 표기법이 다를 수 있습니다. (메모리 주소 100에 값 200이 있고, 주소 200에 값 50이 있다고 가정)

; 1. 즉시 주소 지정: AX 레지스터에 50을 직접 대입
MOV AX, 50          ; AX = 50

; 2. 직접 주소 지정: 주소 100에 있는 값(200)을 AX에 대입
MOV AX, [100]       ; AX = Mem[100] = 200

; 3. 간접 주소 지정: 주소 100이 가리키는 주소(200)의 값(50)을 AX에 대입
MOV AX, [[100]]     ; AX = Mem[Mem[100]] = Mem[200] = 50

; 4. 레지스터 주소 지정: BX 레지스터의 값을 AX로 복사
MOV AX, BX          ; AX = BX

; 5. 베이스 주소 지정: BP 레지스터(값 100) + 오프셋 4 = 주소 104의 값 대입
MOV AX, [BP + 4]    ; AX = Mem[100 + 4] = Mem[104]

; 6. 인덱스 주소 지정: 기준주소 100 + SI레지스터(값 4) = 주소 104의 값 대입
MOV AX, [100 + SI]  ; AX = Mem[100 + 4] = Mem[104]

; 7. 상대 주소 지정: 현재 PC(값 500) + 오프셋 20 = 주소 520으로 분기
JMP 20              ; PC = 500 + 20 = 520

5. 성능 및 효율성 분석

5.1 실행 속도 (Cycle)

메모리 접근은 CPU 내부 연산보다 수십에서 수백 배 느리다. 따라서 메모리 참조 횟수가 적을수록 명령어 실행 사이클이 단축된다. * 최상: 즉시 $\approx$ 레지스터 $\rightarrow$ 직접 $\rightarrow$ 베이스/인덱스/상대 $\rightarrow$ 간접 : 최하

5.2 코드 밀도 (Density)

주소 지정 모드는 프로그램의 크기에도 영향을 미친다. * 직접 지정은 전체 메모리 주소를 명시해야 하므로 명령어 길이가 길어진다. * 상대 지정이나 레지스터 지정은 짧은 오프셋이나 레지스터 번호만 사용하므로 명령어 길이를 줄여 코드 밀도를 높일 수 있다.

6. 현대 아키텍처에서의 활용

6.1 CISC vs RISC

  • CISC (Complex Instruction Set Computer): x86 아키텍처가 대표적이다. 매우 다양하고 복잡한 주소 지정 모드를 제공하여, 하나의 명령어로 복잡한 메모리 연산을 수행하게 함으로써 코드 길이를 줄이는 데 집중한다.
    • 예 (x86): MOV EAX, [EBX + ECX*4 + 12] (베이스 + 인덱스 $\times$ 스케일 + 변위 방식)
  • RISC (Reduced Instruction Set Computer): ARM 아키텍처가 대표적이다. 복잡한 주소 지정 모드를 제거하고 Load/Store 구조를 채택한다. 메모리 접근은 오직 LDR(Load)과 STR(Store) 명령어로만 가능하며, 나머지 연산은 모두 레지스터 간에 이루어진다.
    • 예 (ARM): LDR R0, [R1, #4] (레지스터 R1의 주소에서 4바이트 오프셋 위치의 값을 R0로 로드)

6.2 최신 최적화 경향

최신 CPU는 파이프라이닝(Pipelining)비순차적 실행(Out-of-Order Execution)을 통해 주소 계산 시간을 숨기려 한다. 특히 주소 계산 전용 유닛(AGU, Address Generation Unit)을 별도로 두어, 연산 유닛(ALU)이 데이터를 처리하는 동안 다음 데이터의 유효 주소를 미리 계산하는 방식으로 효율성을 극대화하고 있다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?